#include"mystandard.h"
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

MY_FILE* my_fopen(const char* pathname,const char* mode)
{
    int flag=0;                                   //创建文件的条件
    int fd=-1;                                    //文件的位置
    if(strcmp(mode,"w")==0)
    {
        flag=(O_CREAT | O_WRONLY | O_TRUNC);      //O_CREAT:文件不存在，就创建，O_TRUNC:清空，O_WRONLY:只写
        fd=open(pathname,flag,0666);
    }
    else if(strcmp(mode,"r")==0)
    {
        flag=O_RDONLY;                            //O_RDONL:只读
        fd=open(pathname,flag);
    }
    else if(strcmp(mode,"a")==0)
    {
        flag=(O_CREAT | O_WRONLY | O_APPEND);     //O_APPEND:追加
        fd=open(pathname,flag,0666);
    }
    else
    {
        return NULL;
    }

    if(fd<0)return NULL;                           //则代表文件打开失败

    MY_FILE* fp=(MY_FILE*)malloc(sizeof(MY_FILE)); //开辟空间用于返回文件的位置
    if(fp==NULL)return NULL;

    fp->fileno=fd;
    fp->flag=FLUSH_ALL;                            //刷新方式
    fp->pos=0;                                     //缓存区的位置

    return fp;
}

int my_fwrite(MY_FILE* fp,const char* prt,int size)
{
   memcpy(&fp->buffer[fp->pos],prt,size);         //将prt中的字符拷贝到buffer中
   fp->pos+=size;                                 //更新缓存区字符的位置 
   //全刷新
   if(fp->flag==FLUSH_ALL)                        //选择刷新方式
   {
       if(fp->pos==SIZE)
       {
           write(fp->fileno,fp->buffer,fp->pos);
           fp->pos=0;
       }
   }//立即刷新
   else if(fp->flag==FLUSH_NOW)
   {
       write(fp->fileno,fp->buffer,fp->pos);
       fp->pos=0;
   }
   //行刷新
   else if(fp->flag==FLUSH_LINE)
   {
       if(fp->buffer[fp->pos-1]=='\n')
       {
           write(fp->fileno,fp->buffer,fp->pos);
           fp->pos=0;
       }
   }
   
   return size;
  
}

//刷新
void my_fflush(MY_FILE *fp)
{
    if(fp->pos > 0){
        write(fp->fileno, fp->buffer, fp->pos);
        fp->pos = 0;
    }
}

void my_fclose(MY_FILE* fp)
{
    my_fflush(fp);   //最后在刷新一次以防缓存区中还有字符
    close(fp->fileno);
    free(fp);
}





